OCaml tutorial
installation
sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)
opam install utop
utopすればREPLが立ち上がるようになった
ohbarye.icon 高機能でかっこいい
関数
定義
code:ocaml
# let average a b =
(a +. b) /. 2.0;;
REPLで定義するとval average : float -> float -> float = <fun>のように関数の定義情報が表示される
floatとfloatを受け取ってfloatを返す関数
->で繋がれているのは一見不思議だがカリー化の話に繋がる いくつかのポイント
「整数の足し算(+)」 と「浮動小数点数の足し算(+.)」は明確に区別する
型推論が行われる
OCaml には暗黙の型変換はない
return不要
何も返さないときにはunit型を使う
# let nothing foo = ();;
CやJavaのvoid型をイメージ
再帰関数にする場合は let rec func_nameとする
呼び出し
code:ocaml
# average 5. 10.;;
- : float = 7.5
# average 5. 10;;
Line 1, characters 11-13:
Error: This expression has type int but an expression was expected of type
float
Hint: Did you mean `10.'?
引数の型を誤ると上記のように検知する
average(5., 10.)のようには書けない
カンマも括弧も不要
(5., 10.)はOCamlではtupleになる
多相関数
Generics的な
code:ocaml
# let nothing foo = ();;
これはval nothing : 'a -> unit = <fun>という定義になる
'aはどんな型でも良いことを意味する
nothing 'c' nothing 11 nothing 5.6 すべて合法
ローカル変数…と見せかけたローカルな式
let name = expression inで定義できる
inのあとはインデント不要
code:ocaml
# let average a b =
let sum = a +. b in
sum /. 2.0;;
他言語との違い
Cなどでは変数sumのためにスタック領域が確保され、sumへの再代入ができたりアドレスを取得できる
OCamlではsumは式a +. bの略名にすぎない
代入できない
値を変えることはできない
let束縛をする、という
let sum = をもう一度書くことで再定義はできる
代入や変更がしたい場合は参照を使う
code:ocaml
# let my_ref = ref 0;;
val my_ref : int ref = {contents = 0}